#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
第一行注释是为了告诉Linux/OS X系统，这是一个Python可执行程序，Windows系统会忽略这个注释；
第二行注释是为了告诉Python解释器，按照UTF-8编码读取源代码，否则，你在源代码中写的中文输出可能会有乱码。
'''

'''面向对象学习'''

#object表示继承自哪个类，没有的话传object
class Student(object):
	pass
	
stu=Student()
print stu

'''
如果要让内部属性不被外部访问，可以把属性的名称前加上两个下划线__，
在Python中，实例的变量名如果以__开头，就变成了一个私有变量（private），只有内部可以访问，外部不能访问
通过get set获取设置
'''

class Student(object):
	#构造，名称必须为__init__，第一个参数为self,后面为字段
	#定义private的变量使用__name或_name(这个是约定的)，否则外部可以随意取并且修改
	def __init__(self,name,age):
		self.__name=name
		self.__age=age
	
	#要定义一个方法，除了第一个参数是self外，其他和普通函数一样
	def printInfo(self):
		print u'我叫'+self.__name,u'我今年'+str(self.__age)+u'岁'
		
	def aaa(self,skill):
		print self.__name+u'获得的技能是'+skill
		
	def get_name(self):
		return self.__name
		
	def set_name(self,name):
		self.__name=name

jack=Student('Jack',25)
rose=Student('Rose',50)

print 'jack.__name='+jack.get_name()

jack.set_name('zhijie')

jack.printInfo()
rose.printInfo()
jack.aaa('run')

'''继承'''
 
class Animal(object):
	def run(self):
		print 'Animal is running'

class Dog(Animal):
	def run(self):
		print 'Dog is running'
	
	def eat(self):
		print 'Dog is eating'

class Cat(Animal):
	def run(self):
		print 'Cat is running'

animal=Animal()
dog=Dog()
cat=Cat()

animal.run()
dog.run()
dog.eat()
cat.run()

'''多态'''
def show(animal):
	animal.run()
	
show(Animal())
show(Dog())
show(Cat())

'''对象类型，使用type()函数：'''

print type(123)==type(345)
print type('a')==type('A')
print type(dog)
print type(abs)

#Python把每种type类型都定义好了常量，放在types模块里
import types

print type('abc')==types.StringType
print type(123)==types.IntType
#有一种类型就叫TypeType，所有类型本身的类型就是TypeType
print type(int)==type(str)==types.TypeType

'''isinstance判断类型'''
print isinstance(dog,Dog)
print isinstance(dog,Cat)

#如果要获得一个对象的所有属性和方法，可以使用dir()函数，它返回一个包含字符串的list

print dir(dog)

'''hasattr  setattr'''

class People(object):
	def __init__(self,x):
		self.x=x
		self.__y=10
	
	def add(self):
		return self.x*self.x

people=People(2)

#hasattr是否有某个属性
print hasattr(people,'x')
#__y外部不可访问，所以的结果是False
print hasattr(people,'__y')

#获取一个属性名，如果不存在，返回默认值（第三个参数）
print "getattr(people,'x')=",getattr(people,'x')
print "getattr(people,'hh')=",getattr(people,'hh',999)

#设置一个新的属性
setattr(people,'z',10000)
print getattr(people,'z')

#获取是否有某个方法
print hasattr(people,'add')

a=getattr(people,'add')
print a()


